﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class StructuralKnowledge : MonoBehaviour
{
    string[] summary=new string [4];
    string[] linearTable = new string[3];
    string[] stackAndQueue = new string[3];
    string[] strand = new string[3];
    string[] multidimensional = new string[2];
    string[] tree = new string[3];
    string[] chart = new string[4];
    string[] now=new string [5];
    int arrayNum = 0;
    Text display;//显示文本
    Text page;//页数文本
    Button previous;//上一个
    Button next;//下一个
    // Start is called before the first frame update
    void Start()
    {
        summaryText();
        linearTableText();
        StackText();
        StrandText();
        MultidimensionalText();
        TreeText();
        ChartText();
        now = summary;
        display = transform.GetChild(0).GetComponent<Text>();
        page = transform.GetChild(1).GetComponent<Text>();
        previous = transform.GetChild(3).GetComponent<Button>();
        next = transform.GetChild(4).GetComponent<Button>();
        previous.onClick.AddListener(
            delegate
            {
                PreviousBut();
            });
        next.onClick.AddListener(
            delegate
            {
                NextBut();
            });
    }

    public void TextSet(int a)
    {
        switch (a)
        {
            case 0: display.text = summary[0]; now = summary; break;
            case 1: display.text = linearTable[0]; now = linearTable; break;
            case 2: display.text = stackAndQueue[0]; now = stackAndQueue; break;
            case 3: display.text = strand[0]; now = strand; break;
            case 4: display.text = multidimensional[0]; now = multidimensional; break;
            case 5: display.text = tree[0]; now = tree; break;
            case 6: display.text = chart[0]; now = chart; break;
        }
        arrayNum = 0;
        page.text = "第" + (arrayNum + 1) + "页/共" + now.Length + "页";
    }

    //上一个
    void PreviousBut()
    {
        print(arrayNum);
        if (arrayNum >0)
        {
            arrayNum--;
            display.text = now[arrayNum];
            page.text = "第" + (arrayNum + 1) + "页/共" + now.Length + "页";
        }
    }

    //下一个
    void NextBut()
    {
        print(arrayNum);
        if (arrayNum <=now .Length-1)
        {
            arrayNum++;
            display.text = now[arrayNum];
            page.text = "第" + (arrayNum + 1) + "页/共" + now.Length + "页";
        }
    }

    //图
    void ChartText()
    {
        chart[0] = "\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000第七章 图\n\u3000图的逻辑结构特征就是其结点（顶点）的前趋和后继的个数都是没有限制的，即任意两个结点之间之间都可能相关。\n\u3000图GraphG=（V，E），V是顶点的有穷非空集合，E是顶点偶对的有穷集。\n\u3000有向图Digraph：每条边有方向；无向图Undigraph：每条边没有方向。\n\u3000有向完全图：具有n *（n - 1）条边的有向图；无向完全图：具有n *（n - 1）/ 2条边的无向图；\n\u3000有根图：有一个顶点有路径到达其它顶点的有向图；简单路径：是经过顶点不同的路径；简单回路是开始和终端重的简单路径；\n\u3000网络：是带权的图。\n图的存储结构：\n\u3000邻接矩阵表示法：用一个n阶方阵来表示图的结构是唯一的，适";
        chart[1] = "合稠密图。\n\u3000无向图：邻接矩阵是对称的。\n\u3000有向图：行是出度，列是入度。\n\u3000建立邻接矩阵算法的时间是O（n+n^2+e），其时间复杂度为O（n^2）\n\u3000邻接表表示法：用顶点表和邻接表构成不是唯一的，适合稀疏图。\n\u3000顶点表结构 vertex | firstedge，指针域存放邻接表头指针。\n\u3000邻接表：用头指针确定。 无向图称边表；有向图又分出边表和逆邻接表；\n\u3000邻接表结点结构为 adjvex | next，时间复杂度为O（n+e）。，空间复杂度为O（n + e）\n图的遍历：\n\u3000深度优先遍历：借助于邻接矩阵的列。使用栈保存已访问结点。\n\u3000广度优先遍历：借助于邻接矩阵的行。使用队列保存已访问结点。\n";
        chart[2] = "\u3000生成树的定义：若从图的某个顶点出发，可以系统地访问到图中所有顶点，则遍历时经过的边和图的所有顶点构成的子图称作该图的生成树。\n\u3000最小生成树：图的生成树不唯一，从不同的顶点出发可得到不同的生成树，把权值最小的生成树称为最小生成树（MST）。\n\u3000构造最小生成树的算法：\n\u3000Prim算法的时间复杂度为O（n ^2）与边数无关适于稠密图。\n\u3000Kruskal算法的时间复杂度为O（lge），主要取决于边数，较适合于稀疏图。\n\u3000最短路径的算法：Dijkstra算法，时间复杂度为O（n^2）。类似于prim算法。\n\u3000拓扑排序：是将有向无环图G中所有顶点排成一个线性序列，若<u，v>∈E（G），则在线性序列u在v之前，这种线性序列称为拓扑序列。\n";
        chart[3] = "拓扑排序也有两种方法：\n\u3000无前趋的顶点优先，每次输出一个无前趋的结点并删去此结点及其出边，最后得到的序列即拓扑序列。\n\u3000无后继的结点优先：每次输出一个无后继的结点并删去此结点及其入边，最后得到的序列是逆拓扑序列。\n"; 
    }

    //树
    void TreeText()
    {
        tree[0] = "\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000第六章 树\n\u3000树是n个结点的有限集合，非空时必须满足：只有一个称为根的结点；其余结点形成m个不相交的子集，并称根的子树。\n\u3000根是开始结点；结点的子树数称度；度为0的结点称叶子（终端结点）；度不为0的结点称分支结点（非终端结点）；除根外的分支结点称内部结点；\n\u3000有序树是子树有左，右之分的树；无序树是子树没有左，右之分的树；森林是m个互不相交的树的集合；\n\u3000树的四种不同表示方法：树形表示法；嵌套集合表示法；凹入表示法；广义表表示法。\n\u3000二叉树的定义：是n≥0个结点的有限集，它是空集（n = 0）或由一个根结点及两棵互不相交的分别称作这个根的左子树和右子树的二叉树组成。\n\u3000二叉树不是树的特殊情形，与度数为2的有序树不同。\n";
        tree[1] = "\u3000二叉树的4个重要性质：二叉树上第i层上的结点数目最多为2^（i-1）（i≥1）。；深度为k的二叉树至多有（2^k）-1个结点（k≥1）；在任意一棵二叉树中，若终端结点的个数为n0，度为2的结点数为n2，则n0=n2+1；具有n个结点的完全二叉树的深度为int（log2n）+1.\n\u3000满二叉树是一棵深度为k，结点数为（2 ^ k）-1的二叉树；完全二叉树是满二叉树在最下层自右向左去处部分结点；二叉树的顺序存储结构就是把二叉树的所有结点按照层次顺序存储到连续的存储单元中。（存储前先将其画成完全二叉树）\n\u3000树的存储结构多用的是链式存储。BinTNode的结构为lchild | data | rchild，把所有BinTNode类型的结点，加上一个指向根结点的BinTree型头指针就构成了二叉树的链式存储结构，称为二叉链表。它就是由根指针root唯一确定的。\n\u3000共有2n个指针域，n + 1个空指针。\n\u3000根据访问结点的次序不同可得三种遍历：先序遍历（前序遍历或先根遍历），中序遍历（或中根遍历）、后序遍历（或后根遍历）。时\n";
        tree[2] = "间复杂度为O（n）。\n\u3000哈夫曼树有n个叶结点，共有2n-1个结点，没有度为1的结点，这类树又称为严格二叉树。\n\u3000变长编码技术可以使频度高的字符编码短，而频度低的字符编码长，但是变长编码可能使解码产生二义性。如00、01、0001这三个码无法在解码时确定是哪一个，所以要求在字符编码时任一字符的编码都不是其他字符编码的前缀，这种码称为前缀码（其实是非前缀码）。\n\u3000哈夫曼树的应用最广泛地是在编码技术上，它能够容易地求出给定字符集及其概率分布的最优前缀码。哈夫曼编码的构造很容易，只要画好了哈夫曼树，按分支情况在左路径上写代码0，右路径上写代码1，然后从上到下到叶结点的相应路径上的代码的序列就是该结点的最优前缀码。\n";

    }

    //多维数组
    void MultidimensionalText()
    {
        multidimensional[0] = "\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000第五章 多维数组\n\u3000数组一般用顺序存储的方式表示。\n存储的方式有：\n\u3000行优先顺序，也就是把数组逐行依次排列。PASCAL、C\n\u3000列优先顺序，就是把数组逐列依次排列。FORTRAN\n地址的计算方法：\n\u3000按行优先顺序排列的数组：LOCa（ij）= LOCa（11）+（（i - 1）*n +（j - 1））*d.\n\u3000按列优先顺序排列的数组：LOCa（ij）= LOCa（11）+（（j - 1）*n +（i - 1））*d.\n\u3000矩阵的压缩存储：为多个相同的非零元素分配一个存储空间；对零元素不分配空间。\n\u3000特殊矩阵的概念：所谓特殊矩阵是指非零元素或零元素分布有一定规律的矩阵。\n";
        multidimensional[1] = "\u3000稀疏矩阵的概念：一个矩阵中若其非零元素的个数远远小于零元素的个数，则该矩阵称为稀疏矩阵。\n\u3000稀疏矩阵的压缩存储方式用三元组表把非零元素的值和它所在的行号列号做为一个结点存放在一起，用这些结点组成的一个线性表来表示。但这种压缩存储方式将失去随机存储功能。加入行表记录每行的非零元素在三元组表中的起始位置，即带行表的三元组表。\n";

    }

    //串
    void StrandText()
    {
        strand[0] = "\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000第四章 串\n\u3000串是零个或多个字符组成的有限序列。\n\u3000空串：是指长度为零的串，也就是串中不包含任何字符（结点）。\n\u3000空白串：指串中包含一个或多个空格字符的串。\n\u3000在一个串中任意个连续字符组成的子序列称为该串的子串，包含子串的串就称为主串。\n\u3000子串在主串中的序号就是指子串在主串中首次出现的位置。\n\u3000空串是任意串的子串，任意串是自身的子串。\n\u3000串分为两种：串常量在程序中只能引用不能改变；串变量的值可以改变。\n\u3000串的基本运算有：求串长strlen（char*s），串复制strcpy（char*to，char*from），串联接strcat（char*to，char*from），串比较charcmp（char*s1，char*s2），字符定位strchr（char*s，charc）";
        strand[1] = "\u3000串是特殊的线性表（结点是字符），所以串的存储结构与线性表的存储结构类似。串的顺序存储结构简称为顺序串。\n顺序串又可按存储分配的不同分为：\n\u3000静态存储分配：直接用定长的字符数组来定义。优点是涉及串长的操作速度 快，但不适合插入、链接操作。\n\u3000动态存储分配：是在定义串时不分配存储空间，需要使用时按所需串的长度分配存储单元。\n\u3000串的链式存储就是用单链表的方式存储串值，串的这种链式存储结构简称为链串。链串与单链表的差异只是它的结点数据域为单个字符。\n\u3000为了解决“存储密度”低的状况，可以让一个结点存储多个字符，即结点的大小。\n";
        strand[2] = "\u3000顺序串上子串定位的运算：又称串的“模式匹配”或“串匹配”，是在主串中查找出子串出现的位置。在串匹配中，将主串称为目标（串），子串称为模式（串）。这是比较容易理解的，串匹配问题就是找出给定模式串P在给定目标串T中首次出现的有效位移或者是全部有效位移。最坏的情况下时间复杂度是O（（n-m+1）m），假如m与n同阶的话则它是O（n^2）。链串上的子串定位运算位移是结点地址而不是整数。";
    }

    //栈和队列
    void StackText()
    {
        stackAndQueue[0] = "\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000第三章 栈和队列\n\u3000栈（Stack）是仅限制在表的一端进行插入和删除运算的线性表，称插入、删除这一端为栈顶，另一端称为栈底。表中无元素时为空栈。栈的修改是按后进先出的原则进行的，我们又称栈为LIFO表（Last In First Out）。通常栈有\n\u3000顺序栈和链栈两种存储结构。\n\u3000栈的基本运算有六种：构造空栈，判栈空，进栈，退栈，取栈顶元素。\n\u3000在顺序栈中有“上溢”和“下溢”的现象。 ·“上溢”是栈顶指针指出栈的外面是出错状态。\n\u3000“下溢”可以表示栈为空栈，因此用来作为控制转移的条件。\n";
        stackAndQueue[1] = "\u3000链栈中的基本操作有五种：构造空栈，判栈空，进栈，退栈，取栈顶元素\n\u3000队列（Queue）是一种运算受限的线性表，插入在表的一端进行，而删除在表的另一端进行，允许删除的一端称为队头（front），允许插入的一端称为队尾（rear），队列的操作原则是先进先出的，又称作FIFO表（FirstInFirstOut），队列也有顺序存储和链式存储两种存储结构。\n\u3000队列的基本运算有六种：置空队，判队空，判队满，入队，出队，取队头元素\n\u3000顺序队列的“假上溢”现象：由于头尾指针不断前移，超出向量空间。这时整个向量空间及队列是空的却产生了“上溢”现象。\n\u3000为了克服“假上溢”现象引入循环向量的概念，是把向量空间形成一个头尾相接的环形，这时队列称循环队列。\n";
        stackAndQueue[2] = "判定循环队列是空还是满，方法有三种：\n\u3000一种是另设一个布尔变量来判断；\n\u3000第二种是少用一个元素空间，入队时先测试（（rear + 1）% m = front）？ 满：空；\n\u3000第三种就是用一个计数器记录队列中的元素的总数。\n\u3000队列的链式存储结构称为链队列，一个链队列就是一个操作受限的单链表。为了便于在表尾进行插入（入队）的操作，在表尾增加一个尾指针，一个链队列就由一个头指针和一个尾指针唯一地确定。链队列不存在队满和上溢的问题。在链队列的出队算法中，要注意当原队中只有一个结点时，出队后要同进修改头尾指针并使队列变空。";
    }

    //线性表
    void linearTableText()
    {
        linearTable[0] = "\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000第二章 线性表\n\u3000线性表是由n≥0个数据元素组成的有限序列。\n\u3000n=0是空表；非空表，只能有一个开始结点，有且只能有一个终端结点。\n\u3000线性表上定义的基本运算：\n\u3000构造空表：Initlist（L）\n\u3000求表长：Listlength（L）\n\u3000取结点：GetNode（L，i）\n\u3000查找：LocateNode（L，x）\n\u3000插入：InsertList（L，x，i）\n\u3000删除：Delete（L，i）\n\u3000顺序表是按线性表的逻辑结构次序依次存放在一组地址连续的存储单元中。在存储单元中的各元素的物理位置和逻辑结构中各结点相邻关系是一致的。地址计算：\n";
        linearTable[1] = "LOCa（i）=LOCa（1）+（i-1）*d；（首地址为1）\n在顺序表中实现的基本运算：\n\u3000插入：平均移动结点次数为n / 2；平均时间复杂度均为O（n）。\n\u3000删除：平均移动结点次数为（n-1）/2；平均时间复杂度均为O（n）。\n\u3000线性表的链式存储结构中结点的逻辑次序和物理次序不一定相同，为了能正确表示结点间的逻辑关系，在存储每个结点值的同时，还存储了其后继结点的地址信息（即指针或链）。这两部分信息组成链表中的结点结构。采用单循环链表在实用中多采用尾指针表示单循环链表。优点是查找头指针和尾指针的时间都是O（1），不用遍历整个链表。\n\u3000双链表就是双向链表，就是在单链表的每个结点里再增加一个指向其直接前趋的指针域prior，形成两条不同方向的链。由头指针head惟一确定。";
        linearTable[2] = "\u3000双链表也可以头尾相链接构成双（向）循环链表。\u3000双链表上的插入和删除时间复杂度均为O （1）。\n顺序表和链表的比较\n基于空间：\n\u3000顺序表的存储空间是静态分配，存储密度为1；适于线性表事先确定其大小时采用。\n\u3000链表的存储空间是动态分配，存储密度＜1；适于线性表长度变化大时采用。\n基于时间：\n\u3000顺序表是随机存储结构，当线性表的操作主要是查找时，宜采用。\n\u3000以插入和删除操作为主的线性表宜采用链表做存储结构。\n\u3000若插入和删除主要发生在表的首尾两端，则宜采用尾指针表示的单循环链表。\n";
    }
    //概述
    void summaryText()
    {
        summary[0] = "\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000第一章 概 论\n\u3000数据就是指能够被计算机识别、存储和加工处理的信息的载体。\n\u3000数据元素是数据的基本单位，可以由若干个数据项组成。数据项是具有独立含义的最小标识单位。\n数据结构的定义：\n\u3000逻辑结构：从逻辑结构上描述数据，独立于计算机。\n\u3000线性结构：一对一关系。\n\u3000线性结构：多对多关系。\n\u3000存储结构：是逻辑结构用计算机语言的实现。\n\u3000顺序存储结构：如数组。\n\u3000链式存储结构：如链表。\n\u3000稠密索引：每个结点都有索引项。\n\u3000稀疏索引：每组结点都有索引项。\n\u3000散列存储结构：如散列表。";
        summary[1] = "数据运算:\n\u3000对数据的操作。定义在逻辑结构上，每种逻辑结构都有一个运算集合。\n\u3000常用的有：检索、插入、删除、更新、排序。\n\u3000数据类型：是一个值的集合以及在这些值上定义的一组操作的总称。\n\u3000结构类型：由用户借助于描述机制定义，是导出类型。\n\u3000抽象数据类型ADT：是抽象数据的组织和与之的操作。相当于在概念层上描述问题。\n\u3000优点是将数据和操作封装在一起实现了信息隐藏。\n\u3000程序设计的实质是对实际问题选择一种好的数据结构，设计一个好的算法。算法取决于数据结构。\n\u3000算法是一个良定义的计算过程，以一个或多个值输入，并以一个或多个值输出。";
        summary[2] = "\u3000评价算法的好坏的因素：算法是正确的；执行算法的时间；执行算法的存储空间（主要是辅助存储空间）；算法易于理解、编码、调试。\n\u3000时间复杂度：是某个算法的时间耗费，它是该算法所求解问题规模n的函数。\n\u3000渐近时间复杂度：是指当问题规模趋向无穷大时，该算法时间复杂度的数量级。\n\u3000评价一个算法的时间性能时，主要标准就是算法的渐近时间复杂度。\n\u3000算法中语句的频度不仅与问题规模有关，还与输入实例中各元素的取值相关。\n\u3000时间复杂度按数量级递增排列依次为：常数阶O（1）、对数阶O（log2n）、线性阶O（n）、线性对数阶O（nlog2n）、平方阶O（n ^ 2）、立方阶O（n ^ 3）、……k次方阶O（n ^ k）、指数阶O（2 ^ n）。";
        summary[3] = "n）。\n\u3000空间复杂度：是某个算法的空间耗费，它是该算法所求解问题规模n的函数。\n\u3000算法的时间复杂度和空间复杂度合称算法复杂度。\n";
    }


}
